package 华为OD机试真题2023.进阶题;

import utils.MyUtil;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class HJ27_递增字符串 {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner in = new Scanner(new File("src/main/java/华为OD机试真题2023/进阶题/input/27.txt"));
        MyUtil.START();
        //        Solution(in);
        Solution1(in);
        //        Solution2(in);
        //        Solution3(in);
        MyUtil.END();
    }

    static void Solution(Scanner in) {
        String s = in.nextLine();
        int cntB = 0;
        int min = 0;
        for (char a : s.toCharArray()) {
            if (a == 'B') {
                cntB++;
            }
            if (a == 'A') {
                min = Math.min(min + 1, cntB);
            }
        }
        System.out.println(min);
    }

    /**
     * 最后结果一定形如：AAABBB。遍历到每一位，统计其前面的B个数cntB、后面A个数cntA，以当前位置为分界线 需要改变cntA+cntB次才嫩满足条件。
     *
     * @param in
     */
    static void Solution1(Scanner in) {
        String s = in.nextLine();
        int cntA = 0;
        int cntB = 0;
        for (char a : s.toCharArray()) {
            if (a == 'A') {
                cntA++;
            }
        }
        int min = Integer.MAX_VALUE;
        for (char a : s.toCharArray()) {
            if (a == 'A') {
                cntA--;
            }
            if (a == 'B') {
                cntB++;
            }
            min = Math.min(cntA + cntB, min);
        }
        System.out.println(min);
    }

    static void Solution2(Scanner sc) {
        String string = sc.nextLine();
        int min = 0;
        int countB = 0;
        for (int i = 0; i < string.length(); i++) {
            if (string.charAt(i) == 'B') {
                // 假设之前的子字符串经过修改已满足要求，当前位置的B并不会使字典序变化，只统计B的个数
                countB++;
            }
            if (string.charAt(i) == 'A') {
                // 方案1 : 把所有之前的B改为A
                int candidate1 = countB;
                // 方案2：假设在当前位置以前的子字符串经过修改已满足要求，把当前位置的A改为B,即动态编程思想
                int candidate2 = min + 1;
                min = Math.min(candidate1, candidate2);
            }
        }
        System.out.println(min);
    }

    static void Solution3(Scanner sc) {
        String s = sc.nextLine();
        char[] s1 = s.toCharArray();
        int b = 0, a = 0;
        int min = Integer.MAX_VALUE; // 思路：先假设将所有A变成B所需要的次数为b，总计数量b,然后从新遍历
        for (char c : s1) {
            if (c == 'A') {
                b++;
            }
        }
        for (char c : s1) {
            if (c == 'A') { // 遇到A就b--；
                b--;
            } else { // 遇到B就a++;
                a++;
            }
            min = Math.min(min, a + b); // 维护最小的a+b；
        }
        System.out.println(min);
    }
}
